import java.util.Arrays;
import java.util.HashMap;
import java.util.TreeSet;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-11-08
 * Time: 21:44
 */
public class Solution {
    public static int[] avoidFlood(int[] rains) {
        int len = rains.length;
        int[] ans = new int[len];
        Arrays.fill(ans, 1); // 多余的晴天都用来抽 1 号湖
        TreeSet<Integer> set = new TreeSet<>();
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < len; i++) {
            if (rains[i] == 0) {
                // 晴天, 把这一天存进去
                set.add(i);
            } else {
                // 下雨了
                ans[i] = -1; // 表示不能抽水
                if (map.getOrDefault(rains[i], -1) >= 0) {
                    // 这个湖是满的
                    int lastDay = map.get(rains[i]); // 得到这个湖什么时候满了
                    // 找到比这个日期晚但是最接近这个日期的时间
                    Integer day = set.ceiling(lastDay);
                    if (day == null) {
                        // 没时间抽水
                        return new int[]{}; // 没有办法阻止发生洪水
                    } else {
                        // 抽干
                        map.put(rains[i], i); // 注意这里面把它抽干是在 这一天之前把它抽干 所以现在它仍然是满的, 只不过日期更新为当前这一天
                        ans[day] = rains[i]; // 注意这里面是对 day 这一天分配任务, 而不是当前这天
                        // 删除这个晴天
                        set.remove(day);
                    }
                } else {
                    // 这个湖是空的
                    // 不管它, 让它下满
                    map.put(rains[i], i);
                }
            }
        }
        return ans;
    }
}
